package 力扣.二分;

import java.util.Arrays;

public class 翻转图像832 {
    public static void main(String[] args) {
//        int [][] intss = {{1,1,0},{1,0,1},{0,0,0}};
        int [][] intss = {{1}};
//        int [][] intss = {{1,1,0,0},{1,0,0,1},{0,1,1,1},{1,0,1,0}};
        int[][] ints = flipAndInvertImage(intss);
        System.out.println(Arrays.deepToString(ints));
    }

    /**
     * 技巧：在原数组上面进行操作，根据中间位直接反转。奇偶数问题需要注意一下，可以将奇数看作偶数（奇数中的中间位单独处理）
     * 例子【1，2，3，4】即偶数位，我们直接取第二个元素：2 作为交换位，让它和第三个元素：3 进行交换，接着让第一个元素：1 作为交换位，让它和第四个元素进行交换
     *    【1，2，3，4，5】即奇数位，我们同样取第二个元素：2 作为交换位，让它和第四个元素：4 进行交换，接着让第一个元素：1 作为交换位，让它和第五个元素进行交换。中间的
     *      第三个元素：3 单独处理。

     */
    public static int[][] flipAndInvertImage(int[][] A) {
        int r = A.length;
        int c = A[0].length;
        for (int i = 0; i < r; i++) {
                //取中间值
                int mid = c/2 - 1;//注意：一行的数组长度可能为奇数或者偶数，这里只需将奇数看作偶数（奇数中间那个数单独处理即可）

                if (c % 2 == 1){//若是奇数则需要给中间个那个元素单独提出来变一下
                    A[i][mid + 1] = A[i][mid + 1] == 1 ? 0 : 1;
                }
                //交换位置并反转
                while (mid >= 0){
                    int te = A[i][mid] == 1 ? 0 : 1;
                    A[i][mid] = A[i][c - mid - 1] == 1 ? 0 : 1;
                    A[i][c - mid - 1]  = te;
                    mid--;
                }
        }
        return A;
    }

}
